type operator = Add | Sub | Mul | Div | Equal | Greater | Less | Geq | Leq | Neq | And | Or 
type foperator = Fadd | Fsub | Fmul | Fdiv


type expr =
    Binop of expr * operator * expr
  | FBinop of expr * foperator * expr
  | Not of expr
  | Lit of int
  | Float of float
  | Id of string
  | Str of string
  | Char of char
  | StringList of string
  | StringListAdd of string * expr 
  | Slist of string list
  | Call of string * expr list
  | Int of string
  | Flo of string
  | Assign of string * expr
  | ArrAssign of string * int * expr
  | Stringv of string
  | IntArray of string * int
  | Return of expr
  | Sadd of string * string * expr
  | Smem of string * string 
  | Sfind of string * string 
  | SLadd of string * string * expr
  | SLmem of string * string
  | SLfind of string * string
  | Scre of string
  | SLcre of string 
  | Print of string
  | Intersect of expr * expr
  | GetDistance of expr * expr
  | ObjArray of string * expr * string
  | Objpoint of string  * int * string * string
  | Onedot of string * string
  | Twodot of string * expr * string * expr * string
  | Strcmp of expr * expr

type stmt =
    Expr of expr
  | Block of stmt list
  | While of expr * stmt
  | If of expr * stmt * stmt

type func = {
     fname : string;
     formals : string list;
     body : stmt ;
}

type program = func list
